home *** CD-ROM | disk | FTP | other *** search
- #include <math.h>
- #include "Warp.h"
-
- #define kNumOfStars 70
- #define kProjDistance 450
- #define kLargeStar 0
- #define kSmallStar 1
-
- Star gStarField [kNumOfStars];
- short gVelocity;
- Point gOrigin;
- RgnHandle gOldGrayRgn;
- short gOldMBarHeight;
- WindowPtr gWindow;
- short hPos, vPos;
- Point mouseLoc, oldmouseLoc;
- Boolean continues;
- EventRecord theEvent;
-
- void DoKeyDown (EventRecord *theEvent);
-
- void main (void)
- {
- short loop;
-
- InitToolbox ();
- InitStarField ();
- HideCursor ();
- MainEvent ();
- ShowCursor ();
- }
-
- void InitToolbox (void)
- {
- EventRecord event;
- short count;
- Rect mBarRect;
- RgnHandle mBarRgn;
-
- InitGraf ((Ptr) &qd.thePort);
- InitFonts ();
- InitWindows ();
- InitMenus ();
- TEInit ();
- InitDialogs (nil);
- InitCursor ();
-
- for (count = 1; count <= 3; ++count)
- EventAvail (everyEvent, &event);
-
- gOldMBarHeight = GetMBarHeight ();
- GetMBarHeight () = 0;
- gWindow = NewWindow (nil, &screenBits.bounds, "\p", true, plainDBox, (WindowPtr) - 1,
- false, 0);
- SetRect (&mBarRect, screenBits.bounds.left, screenBits.bounds.top,
- screenBits.bounds.right, screenBits.bounds.top + gOldMBarHeight);
- mBarRgn = NewRgn ();
- RectRgn (mBarRgn, &mBarRect);
- UnionRgn (gWindow->visRgn, mBarRgn, gWindow->visRgn);
- DisposeRgn (mBarRgn);
- SetPort (gWindow);
- FillRect (&gWindow->portRect, black);
-
- GetDateTime (&qd.randSeed);
- }
-
- void InitStarField (void)
- {
- short loop;
-
- gVelocity = 10;
- gOrigin.h = (screenBits.bounds.right - screenBits.bounds.left) / 2;
- gOrigin.v = (screenBits.bounds.bottom - screenBits.bounds.top) / 2;
-
- for (loop = 0; loop < kNumOfStars; loop++)
- {
- CreateStar (&gStarField [loop]);
- }
- }
-
- MainEvent ()
- {
- Point temp;
-
- SetEventMask (mDownMask + keyDownMask + autoKeyMask);
- GetMouse (&oldmouseLoc);
- while (!Button ())
- {
- AnimateStarField ();
- if (GetNextEvent (everyEvent, &theEvent))
- switch (theEvent.what)
- {
- case mouseDown:
- // DoMouseDown ();
- break;
-
- case keyDown:
- case autoKey:
- DoKeyDown (&theEvent);
- break;
-
- default:
- break;
- }
- //• Moves the direction indicators.
- GetMouse (&mouseLoc);
- if (! EqualPt (mouseLoc, oldmouseLoc))
- {
- temp.h = temp.v + (mouseLoc.h - oldmouseLoc.h);
- temp.v = temp.v + (mouseLoc.v - oldmouseLoc.v);
- oldmouseLoc = mouseLoc;
- }
- }
- }
-
- void AnimateStarField (void)
- {
- short loop;
- Point location;
-
- for (loop = 0; loop < kNumOfStars; loop++)
- {
- location = Project (gStarField [loop]);
- ForeColor (blackColor);
- if (gStarField [loop].size == kLargeStar)
- DrawLargeStar (location);
- else
- DrawSmallStar (location);
-
- AnimateStar (&gStarField [loop]);
- location = Project (gStarField [loop]);
- ForeColor (whiteColor);
- if (gStarField [loop].size == kLargeStar)
- DrawLargeStar (location);
- else
- DrawSmallStar (location);
- }
- }
-
- void DrawLargeStar (Point aPt)
- {
- Rect temp;
-
- temp.left = aPt.h - 1;
- temp.right = aPt.h + 1;
- temp.top = aPt.v - 1;
- temp.bottom = aPt.v + 1;
-
- PaintRect (&temp);
- }
-
- void DrawSmallStar (Point aPt)
- {
- MoveTo (aPt.h, aPt.v);
- LineTo (aPt.h, aPt.v);
- }
-
- Point Project (Star aStar)
- {
- Point temp;
-
- temp.h = aStar.x * kProjDistance / aStar.z + gOrigin.h;
- temp.v = aStar.y * kProjDistance / aStar.z + gOrigin.v;
-
- return temp;
- }
-
- void DoKeyDown (EventRecord *theEvent)
- {
- short chCode;
- chCode = theEvent->message & charCodeMask;
-
- switch (chCode)
- {
- case '+':
- gVelocity = gVelocity + 0.1;
- break;
-
- case '-':
- gVelocity = gVelocity - 0.1;
- break;
-
- case 'q':
- case 'Q':
- // continues = false;
- break;
-
- case '0':
- // DoMouseDown ();
- break;
-
- case '4':
- hPos = hPos - 5;
- break;
-
- case '6':
- hPos = hPos + 5;
- break;
-
- case '8':
- vPos = vPos + 5;
- break;
-
- case '5':
- vPos = vPos - 5;
- break;
-
- case '1':
- {
- vPos = 0;
- hPos = 0;
- }
- break;
- }
- }
-
- void AnimateStar (Star *aStar)
- {
- aStar->z = aStar->z - gVelocity;
- if (aStar->z <= 0)
- CreateStar (aStar);
-
- // /* aStar->x = aStar->x - 0;
- // if (aStar->x <= 0)
- // CreateStar (aStar);
- //
- // aStar->y = aStar->y - 0;
- // if (aStar->y <= 0)
- // CreateStar (aStar); */
- }
-
- void CreateStar (Star *aStar)
- {
- aStar->x = GetRandom (0, gOrigin.h);
- if (GetRandom (0, 1) == 0)
- aStar->x = - aStar->x;
-
- aStar->y = GetRandom (0, gOrigin.v);
- if (GetRandom (0, 1) == 0)
- aStar->y = - aStar->y;
-
- aStar->z = GetRandom (0, 150) + 125;
-
- aStar->size = GetRandom (0, 1);
- }
-
- unsigned short GetRandom(unsigned short min, unsigned short max)
- {
- unsigned short random;
- long range, temp;
-
- random = Random();
- range = (max - min) + 1;
- temp = (random * range) / 65536;
- random = temp + min;
-
- return random;
- }